package com.cyz.common.exception;

import com.cyz.common.enums.MyEnums;
import com.cyz.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 全局异常处理器
 */

//开启@ExceptionHandler异常处理注解
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(MyException.class)
    public R systemExceptionHandler(MyException e){
        //打印异常信息
        log.error("项目自定义异常报错原因为{}",e.getMsg());
        //从异常对象中获取提示信息封装饭返回
        return R.error(e.getCode(),e.getMsg());
    }

    @ExceptionHandler(Exception.class)
    public R systemExceptionHandler(Exception e){
        //打印异常信息
        log.error("系统异常报错原因为{}",e.getMessage());
        log.error("{}",e.getClass());
        //从异常对象中获取提示信息封装饭返回
        return R.error(MyEnums.SYSTEM_ERROR,e.getMessage());
    }

    //表单验证报的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R handler(MethodArgumentNotValidException e){
        //获取到错误异常信息
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        //封装map数组
        Map<String, String> collect = fieldErrors.stream()
                .collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
        //打印异常信息
        log.error("异常为{}",MyEnums.VALIDATION.getMsg());
        //返回给前端让前端对返回的信息做处理
        return R.error(MyEnums.VALIDATION, String.valueOf(collect));
    }

    //数据库操作报的异常
    @ExceptionHandler(DuplicateKeyException.class)
    public R handler(DuplicateKeyException e){
        //打印异常信息
        log.error("异常为{}",MyEnums.DATABASE_FAIL.getMsg()+"，重复数据为"+e.getCause().getMessage().split("'")[1]);
        //返回给前端让前端对返回的信息做处理
        return R.error(MyEnums.DATABASE_FAIL.getCode(),MyEnums.DATABASE_FAIL.getMsg()+"，重复数据为"+e.getCause().getMessage().split("'")[1]);
    }

    //参数不足
    @ExceptionHandler(NullPointerException.class)
    public R handler(NullPointerException e){
        //打印异常信息
        log.error("异常为{}",e.getMessage());
        //返回给前端让前端对返回的信息做处理
        return R.error(MyEnums.PARAMETER_LACK);
    }


}
